#ifndef _MYLOGGER_H
#define _MYLOGGER_H
#include "Noncopyable.h"
#include <log4cpp/Category.hh>


#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Priority.hh>
class MyLogger : public Noncopyable
{

    class AutoRelease
    {
    public:
        AutoRelease()
        {}
        ~AutoRelease()
        {
            if (_pInstance)
            {
                delete _pInstance;
            }
        }
    };

public:
    static MyLogger *getinstance()
    {
        if (nullptr == _pInstance)
        {
            _pInstance = new MyLogger();
        }
        return _pInstance;
    }
    static void destory()
    {
        if (_pInstance)
        {
            delete _pInstance;
            _pInstance = nullptr;
        }
    }
    void error(const char *msg);

    template <class... Args>
    void error(const char *msg, Args... args)
    {
        _cat.error(msg, args...);
    }

    void warn(const char *msg);

    template <class... Args>
    void warn(const char *msg, Args... args)
    {
        _cat.warn(msg, args...);
    }

    void debug(const char *msg);

    template <class... Args>
    void debug(const char *msg, Args... args)
    {
        _cat.debug(msg, args...);
    }

    void info(const char *msg);

    template <class... Args>
    void info(const char *msg, Args... args)
    {
        _cat.info(msg, args...);
    }

private:
    MyLogger();
    ~MyLogger();

private:
    static MyLogger *_pInstance;
    log4cpp::Category &_cat;
    // log4cpp::Appender * _pOstreamAppender;
    static AutoRelease _ar;
};

#define addprefix(msg) string("[")                           \
                           .append(__FILE__)                 \
                           .append(":")                      \
                           .append(__func__)                 \
                           .append(":")                      \
                           .append(std::to_string(__LINE__)) \
                           .append("] ")                     \
                           .append(msg)                      \
                           .c_str()

#define LogInfo(msg, ...) MyLogger::getinstance()->info(addprefix(msg), ##__VA_ARGS__)
#define LogError(msg, ...) MyLogger::getinstance()->error(addprefix(msg), ##__VA_ARGS__)
#define LogWarn(msg, ...) MyLogger::getinstance()->warn(addprefix(msg), ##__VA_ARGS__)
#define LogDebug(msg, ...) MyLogger::getinstance()->debug(addprefix(msg), ##__VA_ARGS__)


#endif
